package cn.zqy.demo2.day14FoundationStrengthening.reflect;

import cn.zqy.demo2.day14FoundationStrengthening.Domain.Person;

import java.lang.reflect.Method;

/**
 * 3. 获取成员方法们：
 *      Method[] getMethods()
 *      Method getMethod(String name, 类<?>... parameterTypes)
 *
 *      Method[] getDeclaredMethods()
 *      Method getDeclaredMethod(String name, 类<?>... parameterTypes)
 *
 *      * Method：方法对象
 * 		* 执行方法：
 * 			* Object invoke(Object obj, Object... args)
 *
 * 		* 获取方法名称：
 * 			* String getName:获取方法名
 * */
public class Demo04Method {
    public static void main(String[] args) throws Exception {
        //0.获取Person的Class对象
        Person p = new Person();
        Class personClass = p.getClass();

        // 打印出所有的public方法，包括继承自Object的方法
        Method[] methods = personClass.getMethods();
        for(Method m : methods) {
            System.out.println(m);
        }
        System.out.println("=========");


        Method method = personClass.getMethod("eat");
        System.out.println(method);
        // invoke传递实例化对象
        method.invoke(p);  // 在吃...

        Method method1 = personClass.getDeclaredMethod("eat", String.class);
        method1.setAccessible(true);  // 操作非public必须用暴力反射
        method1.invoke(p, "鱼排");    // 在吃...鱼排
        System.out.println(method1.getName());  //获取函数名eat

        // 获取类名 【全类名：包名+类名】
        System.out.println(personClass.getName()); // cn.zqy.demo2.day14FoundationStrengthening.Domain.Person

    }
}
